home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 1.iso
/
HENSA
/
MISC
/
SHELL.ARC
/
Shell
/
Sources
/
c
/
SpriteRect
< prev
next >
Wrap
Text File
|
1994-10-26
|
4KB
|
176 lines
#include "DeskLib:Sprite.h"
#include "DeskLib:SWI.h"
#include "DeskLib:GFX.h"
#include "DeskLib:Screen.h"
#include "DeskLib:WimpSWIs.h"
#include "Shell.SafeAlloc.h"
#include "Shell.Printf.h"
#include "Shell.Shell.h"
#include "Shell.SpriteRect.h"
const Shell_convertpoint Shell_nullconvert = { 0, 0};
typedef struct {
sprite_areainfo *areainfo;
union {
sprite_header *header;
char *name;
}
sprite;
}
Shell_spriteblock;
static sprite_outputstate oldstate;
static void *savebuffer;
void Shell_RedirectToSprite( Shell_rectblock *rectblock)
{
Shell_spriteblock *spriteblock = (Shell_spriteblock *) rectblock->reference;
int savesize;
/* Find size of savebuffer. */
SWI( 3, 4, SWI_OS_SpriteOp,
256+62, spriteblock->areainfo, spriteblock->sprite.name,
NULL, NULL, NULL, &savesize
);
savebuffer = Shell_SafeCalloc( 1, savesize);
/* Must be calloc, otherwise 'invalid save area' is returned by Sprite_Redirect. */
/* presumably because the alloc-ed block is set to 0 by calloc... */
Sprite_Redirect( (sprite_area) spriteblock->areainfo, spriteblock->sprite.name, savebuffer, &oldstate);
return;
}
void Shell_UnRedirect( void)
{
Sprite_UnRedirect( &oldstate);
free( savebuffer);
return;
}
static void Shell__SpriteRedrawer(
Shell_convertpoint convert,
wimp_point rectsize,
void *reference,
const wimp_rect *redrawrect
)
{
Shell_spriteblock *spriteblock = (Shell_spriteblock *) reference;
UNUSED( redrawrect);
UNUSED( rectsize);
Sprite_Plot( spriteblock->areainfo, spriteblock->sprite.name, convert.x, convert.y, plot_SOLIDBOTH);
return;
}
static BOOL Shell__SpriteRectSaver( char *filename, Shell_rectblock *r)
{
Shell_spriteblock *spriteblock = (Shell_spriteblock *) r->reference;
Error_Check( Sprite_Save( (sprite_area) spriteblock->areainfo, filename));
return TRUE;
}
#define Min( a, b) ( (a) < (b) ) ? (a) : (b)
static int Shell__SpriteRectRamSaver(
task_handle sourcetask,
Shell_rectblockptr r,
task_handle desttask,
void *destbuffer,
unsigned int buffersize,
int progress
)
{
Shell_spriteblock *spriteblock = (Shell_spriteblock *) r->reference;
char *data = ((char *) spriteblock->areainfo) + 4;
int n;
/* Find number of bytes to transfer */
n = Min( spriteblock->areainfo->areasize-4/*first word isn't saved*/-progress, buffersize);
Wimp_TransferBlock(
sourcetask, data + progress,
desttask, destbuffer,
n
);
return n;
}
#define DEFAULT_NAME "NoName"
Shell_rectblock *Shell_AddSpriteRect(
Shell_windblock *wind,
int x,
int y,
int xsize,
int ysize
)
{
int areasize;
sprite_areainfo *areainfo;
Shell_spriteblock *spriteblock;
Shell_rectblock *r;
wimp_point pixelsize;
Screen_CacheModeInfo();
pixelsize.x = xsize >> screen_eig.x;
pixelsize.y = xsize >> screen_eig.y;
areasize = sizeof( sprite_areainfo) + Sprite_MemorySize( pixelsize.x, pixelsize.y, screen_mode, sprite_HASNOMASKPAL);
areainfo = (sprite_areainfo *) Shell_SafeMalloc( areasize);
spriteblock = (Shell_spriteblock *) Shell_SafeMalloc( sizeof( Shell_spriteblock));
spriteblock->areainfo = areainfo;
spriteblock->sprite.name = DEFAULT_NAME;
areainfo->areasize = areasize;
areainfo->numsprites = 0;
areainfo->firstoffset = 16;
areainfo->freeoffset = 16;
Sprite_InitArea( (sprite_area) areainfo);
Sprite_Create( (sprite_area) areainfo, DEFAULT_NAME, 0/*no palette*/, pixelsize.x, pixelsize.y, screen_mode);
r = Shell_AddRectangle3( wind, x, y, xsize, ysize, Shell__SpriteRedrawer, spriteblock);
Shell_MakeRectIcon( r, colour_BLACK, colour_WHITE, "r1");
r->saver = Shell__SpriteRectSaver;
r->ramsaver = Shell__SpriteRectRamSaver;
r->filetype = 0xff9;
r->size = areasize - 4;
return r;
}